package com.ljm.shiro.advice;


import com.ljm.common.dto.BaseResult;
import com.ljm.common.enums.ResultStatus;
import com.ljm.common.excuption.BaseException;
import com.ljm.common.util.ResultUtil;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.lang.reflect.UndeclaredThrowableException;

/**
 * 统一异常处理
 *
 * @author chenHuaMing
 * @version 2018年5月31日
 * @since 1.8
 */
@ControllerAdvice
public class ShiroExceptionHandle {
    /**
     * 日志
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(ShiroExceptionHandle.class);

    /**
     * 权限异常处理
     *
     * @param e 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = UnauthorizedException.class)
    @ResponseBody
    public BaseResult shiroHandle(UnauthorizedException e) {
        LOGGER.error("[权限异常]{}", e);
        return ResultUtil.error(ResultStatus.UNAUTHORIZED.getCode(), ResultStatus.UNAUTHORIZED.getMsg());
    }

    /**
     * 权限异常处理
     *
     * @param e 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = AuthorizationException.class)
    @ResponseBody
    public BaseResult shiroHandle(AuthorizationException e) {
        LOGGER.error("[权限异常]{}", e);
        return ResultUtil.error(ResultStatus.UNAUTHORIZED.getCode(), ResultStatus.UNAUTHORIZED.getMsg());
    }

    /**
     * 自定义异常处理
     *
     * @param baseException 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = BaseException.class)
    @ResponseBody
    public BaseResult handle(BaseException baseException) {
        LOGGER.error("[自定义系统异常]{}", baseException);
        return ResultUtil.error(baseException.getErrorKey(), baseException.getErrorMsg(), baseException.getCause());
    }

    /**
     * 未检查异常异常处理
     *
     * @param e 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = UndeclaredThrowableException.class)
    @ResponseBody
    public BaseResult handle(UndeclaredThrowableException e) {
        //dubbo 从提供者传递异常到消费者，消费者接收 会报这个错误  目前仍没有解决。
        LOGGER.error("[未检查异常异常]{}", e.getUndeclaredThrowable().getCause());
        return ResultUtil.error(ResultStatus.FIAL.getCode(), ResultStatus.FIAL.getMsg(), ExceptionUtils.getFullStackTrace(e.getUndeclaredThrowable().getCause()));
    }

    /**
     * 运行异常处理
     *
     * @param e 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public BaseResult handle(RuntimeException e) {
        LOGGER.error("[运行系统异常]{}", e);
        return ResultUtil.error(ResultStatus.FIAL.getCode(), ResultStatus.FIAL.getMsg(), e.getCause());
    }

    /**
     * 大异常处理
     *
     * @param e 异常
     * @return 2018年5月31日
     * @author: chenHuaMing
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public BaseResult handle(Exception e) {
        LOGGER.error("[大系统异常]{}", e);
        return ResultUtil.error(ResultStatus.FIAL.getCode(), ResultStatus.FIAL.getMsg(), e.getCause());
    }
}
